#!/bin/bash

function usage() {
    echo "示例: ./bochs.sh h1.asm 1 h1.txt 100 h3.asm 0"
    echo "示例解释:"
    echo -e "\t h1.asm编译后写入 1扇区"
    echo -e "\t h1.txt直接写入 100扇区"
    echo -e "\t h3.asm编译后写入 0扇区"
    echo "注意："
    echo -e "\t .asm后缀名的文件会经过nasm编译后写入指定扇区"
    echo -e "\t 非.asm后缀名的文件会直接写入指定扇区"
    echo -e "\t 扇区数范围：>=0"
    exit
}

#临时文件产生目录
declare tmp_dir=/tmp/bochs
if [[ ! -d $tmp_dir ]]
then
  mkdir -p $tmp_dir
fi

if [[ ! -f $tmp_dir/hd.dmg ]]
then
  #创建硬盘(256M)
  bximage -q -hd=256 -func=create -imgmode=flat $tmp_dir/hd.dmg > /dev/null
fi

for((i=1;i<$#;i+=2)) ; do
  j=$((i+1))
  file=${!i}
  num=${!j}

  if [[ ! -f $file ]]
  then
    echo "$file 文件不存"
    exit
  fi

  if [[ $num -lt 0 ]]
  then
    echo "${file}文件写入扇区${num}不合理，请输入一个有效的写入扇区数，单位：块(512b)"
    exit
  fi

  if [[ "${file##*.}" == "asm" ]]
  then
    #编译asm文件
    rm -rf $tmp_dir/$i.bin
    nasm -g -f bin -o $tmp_dir/$i.bin $file > /dev/null
    if [[ $? != 0 ]]
    then
      echo "${file}文件编译失败"
      exit
    fi
    echo "${file}文件编译成功"

    #编译后的二进制文件写入到指定扇区
    echo "${file}文件编译后,开始写入${num}扇区"
    dd if=$tmp_dir/$i.bin of=$tmp_dir/hd.dmg bs=512 seek=$num conv=notrunc
    if [[ $? != 0 ]]
    then
      echo "${file}文件写入${num}扇区失败"
      exit
    fi
    echo "${file}文件写入${num}扇区成功"
    continue
  fi

  #普通文件直接写入到指定扇区
  echo "${file}文件无需编译,开始写入${num}扇区"
  dd if=$file of=$tmp_dir/hd.dmg bs=512 seek=$num conv=notrunc
  if [[ $? != 0 ]]
  then
    echo "${file}文件写入${num}扇区失败"
    exit
  fi
  echo "${file}文件写入${num}扇区成功"
done

while getopts "h" arg; do
    case $arg in
      h|?):
        usage
        ;;
      esac
done

#构建bochs需要的配置文件
if [[ ! -f $tmp_dir/bochs.conf ]]
then
  echo "# 第一步，首先设置Bochs在运行过程中能够使用的内存，本例为128MB。
#内存容量
megs: 128

# 设置对应真实机器的BIOS和VGA BIOS.
# 对应两个关键字为：romimage 和 vgaromimage
romimage: file=\$BXSHARE/BIOS-bochs-latest
vgaromimage: file=\$BXSHARE/VGABIOS-lgpl-latest

#选择启动盘符。
boot: disk

#设置Bochs所使用的磁盘
ata0-master: type=disk, path=\"$tmp_dir/hd.dmg\", mode=flat

#设置日志文件的输出。
log: /var/log/bochs.log

#关闭鼠标
mouse: enabled=0
#键盘配置
keyboard: keymap=#\$BXSHARE/keymaps/x11-pc-us.map
#使用GUI界面
display_library: sdl2" > $tmp_dir/bochs.conf
fi

echo ""
echo "------------------------------------------------------------------------------------------------------------------"
echo "------------------------------------------------------------------------------------------------------------------"
echo "-----------------------------------------------------bochs开始运行-------------------------------------------------"
echo "------------------------------------------------------------------------------------------------------------------"
echo "------------------------------------------------------------------------------------------------------------------"
echo ""
echo ""
bochs -f $tmp_dir/bochs.conf